package com.sq.bootshiro.common.utils;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;

import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;

/**
 * @Description: 自定义redis封装工具类
 * @date :2019-07-02 15:18:31
 * @params: No such property: code for class: Script1
 */
@Component
public final class RedisUtil {
    @Autowired
//    private RedisTemplate<String, Object> redisTemplate;
    private StringRedisTemplate stringRedisTemplate;

    /**
     * 执行set操作
     *
     * @param key
     * @return
     */
    public void set(final String key, final String value) {
        stringRedisTemplate.opsForValue().set(key, value);
    }

    /**
     * 执行get操作
     * @param key
     * @return
     */
    public String get(final String key) {
        return stringRedisTemplate.opsForValue().get(key);
    }

    /**
     * 执行delete操作
     *
     * @param key
     * @return
     */
    public boolean del(final String key) {
        return stringRedisTemplate.delete(key);
    }


    /**
     * 执行set操作并且设置生存时间，单位为：秒
     *
     * @param key
     * @param value //TimeUnit.SECONDS 秒
     *              //TimeUnit.MINUTES 分
     * @return
     */
    public void set(final String key, final String value, final Integer seconds) {
        stringRedisTemplate.opsForValue().set(key, value, seconds, TimeUnit.SECONDS);
    }


    /**
     * 执行hset操作
     *
     * @param key
     * @param
     * @return
     */
    public void hset(final String key, final String mapkey, final String mapvalue) {
        stringRedisTemplate.opsForHash().put(key, mapkey, mapvalue);
    }

    /**
     * 执行hgetAll操作
     *
     * @param key
     * @param
     * @return
     */
    public Map<String, String> hgetAll(final String key) {
        return (Map)stringRedisTemplate.opsForHash().entries(key);
    }

    /**
     * 执行hdel操作
     *
     * @param key
     * @param
     * @return
     */
    public long hdel(final String key, final String[] strings) {
        return stringRedisTemplate.opsForHash().delete(key, strings);
    }


    /**
     * 执行hkeys操作
     *
     * @param
     * @param key
     * @return
     */
    public Set<String> hkeys(final String key) {
        return (Set) stringRedisTemplate.opsForHash().keys(key);
    }


    /**
     * 执行hvalues操作
     *
     * @param
     * @param key
     * @return
     */
    public List<String> hvalues(final String key) {
        return (List) stringRedisTemplate.opsForHash().values(key);
    }


    /**
     * 执行hget操作
     *
     * @param
     * @param key
     * @return
     */
    public String hget(final String key, final String mapkey) {
        return (String)stringRedisTemplate.opsForHash().get(key, mapkey);
    }

    /**
     * 执行hmset操作
     *
     * @param
     * @param key
     * @return
     */
    public void hmset(final String key, final Map<String, String> mapvalue) {
        stringRedisTemplate.opsForHash().putAll(key, mapvalue);
    }


    /**
     * 执行lpush操作
     * @param
     * @param key
     * @return
     */
    public long lpush(final String key,final String value) {
        return stringRedisTemplate.opsForList().leftPush(key,value);
    }

    /**
     * 执行lpop操作
     * @param
     * @param key
     * @return
     */
    public String lpop(final String key) {
        return stringRedisTemplate.opsForList().leftPop(key);
    }

    /**
     * 执行rpop操作
     * @param
     * @param key
     * @return
     */
    public String rpop(final String key) {
        return stringRedisTemplate.opsForList().rightPop(key);
    }

    /**
     * 执行list操作
     * 在列表中的尾部添加一个个值，返回列表的长度
     *
     * @param key
     * @return
     */
    public Long rpush(final String key, final String value) {
        return stringRedisTemplate.opsForList().rightPush(key,value);
    }

    /**
     * 执行list操作
     * 在列表中的尾部添加多个值，返回列表的长度
     *
     * @param key
     * @return
     */
    public Long rpush(final String key, final String[] value) {
        return stringRedisTemplate.opsForList().rightPushAll(key,value);
    }
    /**
     * 执行list操作
     * 获取List列表
     *
     * @param key
     * @return
     */
    public List<String> lrange(final String key, final long start, final long end) {
        return stringRedisTemplate.opsForList().range(key,start,end);
    }


    /**
     * 执行list操作
     * 通过索引获取列表中的元素
     *
     * @param key
     * @return
     */
    public String lindex(final String key, final long index) {
        return stringRedisTemplate.opsForList().index(key,index);
    }

    /**
     * 执行list操作
     * 获取列表长度，key为空时返回0
     *
     * @param key
     * @return
     */
    public Long llen(final String key) {
        return stringRedisTemplate.opsForList().size(key);
    }


    public boolean expire(final String key, final Integer seconds) {
        return stringRedisTemplate.expire(key,seconds,TimeUnit.SECONDS);
    }





    /**
     * 判断key是否存在
     * @param key
     * @return
     */
    public boolean exists(String key) {
        return stringRedisTemplate.hasKey(key);
    }

    /**
     * 判断key是否过期
     * @param key
     * @return
     */
    public boolean isExpire(String key) {
        return expire(key) > 1?false:true;
    }


    /**
     * 从redis中获取key对应的过期时间;
     * 如果该值有过期时间，就返回相应的过期时间;
     * 如果该值没有设置过期时间，就返回-1;
     * 如果没有该值，就返回-2;
     * @param key
     * @return
     */
    public long expire(String key) {
        return stringRedisTemplate.opsForValue().getOperations().getExpire(key);
    }
}








